package com.hisicom.scqxspxcjc.base.service;

import cn.hutool.core.util.StrUtil;
import com.hisicom.scqxspxcjc.base.bean.BaseEntity;
import com.hisicom.scqxspxcjc.base.dao.BaseRepository;
import com.hisicom.scqxspxcjc.base.exception.NotFindException;
import com.hisicom.scqxspxcjc.base.exception.NotNullException;
import lombok.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static com.hisicom.scqxspxcjc.base.page.PageTool.page;

/**
 * @author zhonggls
 * @date 2023/9/7 16:37
 * @Explain 该通用方法需要bean继承BaseEntity,
 */
public interface BaseService<E extends BaseEntity, ID extends Serializable> {

    @Autowired
    BaseRepository<E, ID> getRepository();

    /**
     * 通过id查找 未找到返回null
     *
     * @param id
     * @return
     */
    default E findById(@NonNull String id) {
        return getRepository().findById((ID) id).orElse(null);
    }

    default List<E> findByIds(String[] ids) {
        List<E> list = new ArrayList<>();
        for (int i = 0; i < ids.length; i++) {
            E e = getRepository().findById((ID) ids[i]).orElse(null);
            if (e != null) {
                list.add(e);
            }
        }
        return list;
    }

    /**
     * 通过id查找 未找到抛错
     *
     * @param id
     * @return
     */
    default E getById(String id) {
        stringNotNullMsg(id, "查询时" + this.getClass().getName() + "id不能为空");
        Optional<E> optional = getRepository().findById((ID) id);
        if (!optional.isPresent()) {
            throw new NotFindException("通过id:" + id + "查找失败!");
        }
        return optional.get();
    }

    /**
     * 删除
     *
     * @param e
     */
    default void delete(E e) {
        getRepository().delete(e);
    }

    default void delete(List<E> e) {
        getRepository().deleteAll(e);
    }

    default E save(E e) {
        return getRepository().save(e);
    }

    default List<E> saveAll(List<E> eList) {
        return getRepository().saveAll(eList);
    }

    default void deleteById(String id) {
        getRepository().deleteById((ID) id);
    }

    default List<E> findAll() {
        return getRepository().findAll(Sort.by(Sort.Direction.fromString("desc"), "createTime"));
    }

    default Page<E> findAllPage(Pageable pageable) {
        return getRepository().findAll(pageable);
    }

    default Page<E> findAllPage(int page, int size) {
        return getRepository().findAll(page(page, size, "createTime"));
    }

    default Page<E> findAllPage(int page) {
        return getRepository().findAll(page(page, "createTime"));
    }

    /**
     * String 判断非null和非空字符串
     *
     * @param data 判断的String参数
     * @param msg  抛出的异常提示
     */
    public static void stringNotNullMsg(String data, String msg) {
        if (StrUtil.isBlank(data)) {
            if (StrUtil.isNotBlank(msg)) {
                throw new NotNullException(msg);
            } else {
                throw new NotNullException("参数不能为空");
            }
        }
    }
}
